#if !defined(__APP_DEVICE)
#define __APP_DEVICE

#include <pthread.h>
#include "app_buffer.h"
#include "app_message.h"
#include "app_pool.h"

// 设备 是指对应一个主板连接的设备 可能是lora  可能是蓝牙  可能是通过串口连接，可能通过can方式连接
// 此处定义的是作为一个通用设备的基本功能，
//比如设备的初始化，比如设备的启动，设备的停止， 
//1  设备启动后要从文件中读取数据，并提交给线程池处理 
//2  设备接收到队列中数据后要 如何写入到设备文件中   2步 ：1接收队列中的数据  2 利用线程池 从缓存中读取数据，写入到设备中。 (异步)
//3  设备接收到设备文件中的数据，如何写入到队列中    2步 ：1从设备中读入缓存  2 利用线程池 从缓存中读取数据，写入到队列中。 (异步)                       

// 连接类型
typedef enum
{ 
    DEV_GENERAL,
    DEV_SERIAL,
    DEV_CAN  
}DeviceType;


//设备
// 1 设备的文件名  /dev/xxx 字符串
// 2 设备的fd     数字
// 3 设备的读缓存   Buffer
// 4 设备的写缓存   Buffer
// 5 设备的一些方法   struct
// 6 设备的操作读线程 pthread
// 7 设备是否生在工作 int 
// 8 上一次的写入时间戳 long

typedef struct 
{
   char *filename;  // 1 设备的文件名  /dev/xxx 字符串
   int fd;// 2 设备的fd     数字
   DeviceType type;
   ConnectionType conn_type;
   Buffer *read_buffer;// 3 设备的读缓存   Buffer
   Buffer *write_buffer;// 4 设备的写缓存   Buffer
   DeviceFunc dev_func;// 5 设备的一些方法   struct
   pthread_t read_thread;  // 6 设备的操作读线程 pthread
   int is_running;// 7 设备是否生在工作 int 
   long last_write_ts;// 8 上一次的写入时间戳 long
}Device;

typedef struct 
{
     int (*post_read)(Device *device,void *,int); //返回：新长度 参数：设备，待加工数据的容器，待加工数据长度
     int (*pre_write)(Device *device,void *,int);//返回：新长度 参数：设备，待加工数据的容器，待加工数据长度
}DeviceFunc;

//比如设备的初始化，比如设备的启动，设备的停止， 
//1  设备启动后要从文件中读取数据，并提交给线程池处理 
//2  设备接收到数据后要 如何写入到设备文件中     

/**
 * 设备的初始化
 */
Device *app_device_init(char * filename);


/**
 *  设备的启动
 */
int app_device_start(Device *device);


/**
 * 设备的停止
 */
int app_device_stop(Device *device);


/**
 * 设备的销毁
 */
int app_device_close(Device *device);


/**
 * 设备的接收数据
 */
int app_device_recvMsg(Device *device,char *data,int len);

#endif